منبع اصلی نوشتار زیر در این لینک قرار دارد

آدرس دهی درست

یکی از دغدغه های فعلی طراحان وب، ایجاد لینک های “موتور جستجو پسند!” شده. پر بیراه هم نیست، که این لینکها هم به راحتی به خاطر سپرده میشوند و هم اینکه خواناتر هستند هم برای آدمیزاد هم ربات. ابن لینکها، برای یک سایت SEO Friendly یکی از مهمترین بخشهاست.
اکثر CMS ها یا Framework ها امکاناتی برای ایجاد این لینکها معرفی میکنند. منتها اگر لازم باشه که خودتون بنویسیدش، شاید یه کم دردسر ساز بشه. تو این پست میخوام توضیح بدم با‌ آپاچی و PHP چطوری میشه این کار رو انجام داد.
معمولا، آدرسهای اینترنتی به این صورت هستن :


http://example.com/users.php?id=10&action=delete&uid=somedata

که ما ترجیح میدیم (مثلا) اینطوری باشن (که من هدفم همینه):


http://example.com/users/id:10/action:delete/uid:somedata

یا مثلا این :


http://example.com/users/id/10/action/delete/uid/somedata

دو تا حالت فرقی نمیکنه، شاید شما بخواید حتی جور دیگه ای ایجادش کنید که یه کم بحث سلیقه و انتخاب شخصی خودتون و نیازها مطرح میشه. من حالت اول رو توضیح میدم، دومی هم آنچنان فرقی نمیکنه.

۱- ملزومات
اولین چیز آپاچی هستش با mod_rewrite که روش نصب و فعال باشه. برای باقی وب سرور ها هم ممکنه، مثلا lighttpd هم این قابلیت رو داره با کمی تفاوت، و IIS 7 هم . منتها برای IIS های قدیمیتر، بدون یک سری اضافات ممکن نیست. البته میشه از error document استفاده کرد، که در آینده اگه حسش بود و وقتش بود توضیح میدم دربارش (همین الان من از این استفاده میکنم، توی IIS 6 و همین وبلاگ)
بعد از نصب آپاچی مطمئن بشید که mod_rewrite فعاله. توی تنظیمات بگردید دنبالش، یه خطی به این صورت :

LoadModule rewrite_module modules/mod_rewrite.so

البته نکته جالب برای خودم اینه که الان اصلا و ابدا من این فایل mod_rewrite.so رو ندارم، توی تنظیمات آپاچی هم نیست همچین خطی ولی rewrite فعاله!! (من از Zend Server CE استفاده میکنم) حالا راه ساده تر (اگه به تنظیمات دسترسی ندارید یا مثل من نسخه تغییر داده شده آپاچی رو نصب دارید) اینه که اینطوری تستش کنید:
یه فایل بسازیدد توی پوشه ریشه آپاچی به اسم .htaccess (یک نقطه، قبل از اسم فایل هست، یعنی در حقیقت فایلی بدون اسم با پسوند htacces برای ویندوزیها و برای لینوکسی ها یک فایل مخفی.)
تا جایی که یادمه توی ویندوز نمیشد از طریف explorer چنین فایلی ساخت، به جاش یه فایل بسازید با notepad بعد با اون که ذخیرش کنید با این اسم.داخلش این کد رو بنویسید :

RewriteEngine On

بعد سایت رو از طریق بروزر باز کنید. اگه صفحه 500, Internal Server Error گرفتید یعنی نصب نیست. در غیر اینصورت مشکلی نیست.

یه نکته که فراموش کرده بودم این بود که توی تنظیمات اصلی آپاچی، اونجایی که Virtual Host رو تعریف میکنید عبارت
AllowOverride All
باشه، یعنی دست کم None نباشه به جای All.

باقیش هم که فقط مربوط میشه به PHP و تمام.

۲- mod_rewrite
این ماژول آپاچی خودش کلی ریزه کاریها داره. منتها من فقط با یه سری تنظیمات ساده کار دارم و همونها رو توضیح میدم. توی فایل htaccess اینو بنویسید :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

این فایل، و این تنظیمات، باعث میشه که تمام درخواستهای که به وب سرور میرسن ولی وجود ندارن (یعنی تو ریشه پوشه ای به اون نام وجود نداره و فایلی هم به اون اسم و آدرس نیست، فرستاده بشن به فایل index.php ، و این همون چیزی هستش که ما لازم داریم.
در حقیقت تو این تنظیمات، ما سه تا شرط داریم که با RewriteCond شروع شدن و اگر هم دقت کنید متوجه میشید که با هم ترکیب شدن (با OR ) و در نهایت هم RewriteRule که مشخص میکنه وقتی شرطها برقرار شدن آپاچی چیکار کنه.

خوب دیگه تا اینجا کار ما با آپاچی تمومه. از این به بعد میریم سراغ PHP

۳- PHP
گام سوم و آخر PHP هستش. چطوری بفهمیم درخواستی که اومده چه پارامترهایی داره و اونو پردازش کنیم؟
مطمئن بشید فایل index.php رو ساختید. این فایل رو بگذارید کنار فایل .htaccess .توی این فایل این کد رو بنویسید :

<?php
	echo $_SERVER['REQUEST_URI'];

با هر آدرسی دوست دارید (البته قسمت سرورش که ثابته، منظورم از سرور به بعده) اون رو فراخوانی کنید، میبینید که آدرس نمایش داده میشه و در همه موارد این فایل اجرا میشه.
سعی کنید یه فایل موجود رو آدرس دهی کنید، مثلا یه عکس و یا یه فایل جاوااسکریپت، میبینید مشکلی پیش نمیاد و اون فایل درست برگردونده میشه.

حالا میرسیم به بحث اول خودمون.
من میخوام اینچنین ساختار لینکی ایجاد کنم :


http://example.com/somefile/parameter1:value1/parameter2:value2

با هر چند پارامتر که لازمه. البته تو مدلهای MVC معمولا به اینصورته :


http://example.com/module/controller/action/param1:value1/param2:value2

که به جای : از / هم استفاده میشه در بعضی پیاده سازیها مثل Zend ولی من حالت ساده تر رو پیش میگیرم.
من چند تا فایل دارم، که قسمت اول بعد از آدرس سایت اسم اون فایله. مثلا فایل users.php و فایل products.php . فایل index.php هم که ورودی سایت هستش. وی index.php این کد رو قرار بدید :

<?php

	$address=$_SERVER['REQUEST_URI'];
	$addressStack=explode('/',$address);
	//First one is always empty string, so remove it. 
	array_shift($addressStack);
	
	//Next step is to get file and parameter
	if ($addressStack[0]==''){
		//This is default call. just show the message:
?>
	This is index..<br />
	<a href="/users/name:ali">Ali's page</a><br />
	<a href="/products/cat:home/sortby:price">Show some product catagory page</a>
<?php
	die();
	}
	
	$page=array_shift($addressStack);
	$params=array();
	foreach ($addressStack as $stack){
		$p=explode(':',$stack);
		if (isset($p[1]))
			$params[$p[0]]=$p[1];
		else
			$params[$p[0]]=null;
	}
	
	function callPage($page,$params){
		echo "You are in page $page";
		echo "<br />Parameters are :<pre>";
		echo print_r($params,true);
		echo "</pre>";
	}
	
	callPage($page,$params);

این کد میتونه به عنوان یه شروع کمکتون کنه. با این فرض که callPage یه تابعه که شما رو به هر صفحه میفرسته. (یعنی بر اساس آرگومان page صفحه درست رو include میکنه . البته مواظب باشید و به نکات امنیتی توجه کنید!)
نکته مهمی که در این مورد وجود داره اینه که حتما، صفحاتی که وجود ندارن رو مدیریت کنید. یعنی توی تابع callPage حتما بررسی کنید که آیا صفحه وجود داره اگه وجود داره فراخوانی بشه اگر نه، خطای ۴۰۴ به درستی ایجاد بشه، چون وجود خطای ۴۰۴ مناسب خودش یکی از اصوله!



برچسب ها : , , , , , , ,